export const mixins = {
  data () {
    return {
      tableHeight: null, // 表格高度
      isDisabled: true, // 是否禁用
      isDialogOpen: false, // 弹窗是否显示
      dialogMode: 'ADD', // 弹窗模式，新增ADD，修改EDIT
      dialogForm: {}, // 弹窗中的表单
      initDialogForm: {}, // 初始化表单数据
      currentData: {}, // 当前查看数据对象
      pageNum: 1, // 当前页
      pageSize: 10, // 分页大小
      pageTotal: 0 // 列表总条数
    }
  },
  methods: {
    /**
     * 列表数据新增通用方法
     * @param string formName 传入的表单的ref
     */
    commonAddData (formName) {
      this.dialogForm = Object.assign({}, { ...this.initDialogForm })
      this.isDisabled = false
      this.dialogMode = 'ADD'
      this.openDialog(formName)
    },
    /**
     * 列表数据删除通用方法
     * @param string url 传入的接口api地址
     * @param boolean isBatchDel 是否批量删除，true为是，false为否
     * @param string paramsType 参数类型string（字符串）/array（数组）
     * @param boolean isUrlParams 参数是否为地址栏参数
     * @param array/string data 传入删除数据对象的id
     * @param function success 成功的回调函数
     * @param function fail 失败的回调函数
     */
    commonDeleteData (url, {
      isBatchDel = false,
      paramsType = 'string',
      isUrlParams = true,
      params,
      success,
      fail
    } = {}) {
      this.$csii.uiConfirm('是否删除该数据?', {
        confirmCallback: () => {
          let _params = {}
          if (isBatchDel) {
            if (typeof params === 'string') {
              _params.ids = paramsType === 'string' ? params : params.split()
            } else if (Array.isArray(params)) {
              _params.ids = paramsType === 'string' ? params.join() : params
            }
          } else if (params) {
            _params.id = params
          }
          this.$csii.ajax(url, {
            method: 'delete',
            isUrlParams,
            params: _params
          }).then((res) => {
            this.pageNum = 1
            this.$message.success('删除成功')
            if (success && typeof success === 'function') {
              success()
            }
          }).catch((err) => {
            if (fail && typeof fail === 'function') {
              fail(err)
            } else {
              console.error(err)
            }
          })
        },
        cancelCallback: () => {
          this.$message.info('已取消删除')
        }
      })
    },
    /**
     * 列表数据修改通用方法
     * @param string formName 传入的表单的ref
     * @param data 传入编辑数据对象
     */
    commonEditData ({
      formName,
      params = {},
      callback
    }) {
      this.dialogMode = 'EDIT'
      this.isDisabled = true
      this.currentData = JSON.parse(JSON.stringify(params)) // 保存当前对象
      this.dialogForm = JSON.parse(JSON.stringify(params)) // 解除双向绑定
      this.openDialog(formName)
      if (callback && typeof callback === 'function') {
        callback()
      }
    },
    /**
     * 列表数据查询通用方法
     * @param string url 传入的接口api地址
     * @param boolean isPageOrNot 是否分页
     * @param object paramsData 查询参数
     * @param function success 成功回调函数
     * @param function fail 失败回调函数
     */
    commonQueryPageList (url, {
      method = 'post',
      isPageOrNot = true,
      params = {},
      success,
      fail
    } = {}) {
      let _params = {}
      if (isPageOrNot) {
        _params.pageNum = this.pageNum
        _params.pageSize = this.pageSize
      }
      Object.assign(_params, params)
      this.$csii.ajax(url, {
        method,
        showLoading: true,
        params: _params
      }).then(res => {
        if (isPageOrNot) {
          this.pageTotal = res.data.totalElements
          // this.pageNum = res.data.pageNum
        }
        if (success && typeof success === 'function') {
          success(res.data)
        }
      }).catch(err => {
        if (fail && typeof fail === 'function') {
          fail(err)
        } else {
          console.error(err)
        }
      })
    },
    /**
     * 提交表单数据通用方法
     * @param string url 传入的接口api地址
     * @param object params 传入的表单数据
     * @param function success 成功的回调函数
     * @param function fail 失败的回调函数
     */
    commonSubmitData (url, {
      method = 'post',
      info = '添加成功',
      params,
      success,
      fail
    } = {}) {
      if (this.dialogMode === 'EDIT' && !this.isDataChange(this.dialogForm, this.currentData)) {
        this.$csii.uiConfirm('该数据没有进行编辑操作，是否关闭弹窗?', {
          confirmCallback: () => {
            this.closeDialog()
          },
          cancelCallback: () => {}
        })
        return false
      }
      this.$csii.ajax(url, {
        method,
        params
      }).then(() => {
        this.$message.success(info)
        if (success && typeof success === 'function') {
          success()
        }
        this.dialogForm = Object.assign({}, { ...this.initDialogForm })
        this.closeDialog()
      }).catch(err => {
        if (fail && typeof fail === 'function') {
          fail(err)
        } else {
          console.error(err)
        }
      })
    },
    /**
     * 重置表单通用方法
     * @param string formName 传入的表单的ref
     * @param object params 传入表单初始化数据
     * @param function callback 回调函数
     */
    commonResetFormData ({
      formName,
      callback
    } = {}) {
      if (formName) {
        this.$refs[formName].resetFields()
      }
      if (this.dialogMode === 'ADD') {
        this.dialogForm = Object.assign({}, { ...this.initDialogForm })
      } else {
        this.dialogForm = { ...this.currentData }
      }
      if (callback && typeof callback === 'function') {
        callback()
      }
    },
    /**
     * 初始化表单数据
     * @param object params 初始化表单数据
     */
    initFormData (params = {}) {
      this.initDialogForm = Object.assign({}, params)
    },
    // 打开弹窗通用方法
    openDialog (formName) {
      this.isDialogOpen = true
      if (formName) {
        this.$nextTick(() => {
          this.$refs[formName].clearValidate()
        })
      }
    },
    // 关闭弹窗通用方法
    closeDialog () {
      this.isDialogOpen = false
    },
    /**
     * 判断一个对象数据是否修改
     * @param object newList 新的数据对象
     * @param object oldList 旧的数据对象
     */
    isDataChange (newList, oldList) {
      let flag = false
      for (let key in newList) {
        if (newList[key] && typeof newList[key] === 'object') {
          this.isDataChange(newList[key], oldList[key])
        } else {
          if (newList[key] !== oldList[key]) {
            flag = true
            break
          }
        }
      }
      return flag
    },
    // 每页显示条目个数通用方法
    handleSizeChange (val) {
      this.pageSize = val
      this.handleCurrentChange()
    },
    /**
     * 当前页数通用方法
     * @param string val 自带参数
     * @param function callback 定义的回调函数
     */
    handlePageCurrentChange (val, callback) {
      this.pageNum = val
      if (callback && typeof callback === 'function') {
        callback()
      }
    },
    // 设置高度
    setHeight () {
      this.$nextTick(() => {
        this.tableHeight = this.$refs.pageMain.offsetHeight - 140
      })
    }
  },
  created () {
    let _this = this
    window.addEventListener('resize', function () {
      _this.setHeight()
    })
  },
  mounted () {
    this.setHeight()
  }
}
